#ifndef ROBOTCLIENT_H
#define ROBOTCLIENT_H

#include <QObject>
#include <QTcpSocket>
#include <QTimer>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QFile>
#include <QQueue>
#include <QMutex>
#include <QMutexLocker>
#include <QByteArray>
#include <QJsonArray>  // 添加QJsonArray头文件
#include <QHostAddress>
#include <QDebug>
#include <QDateTime>
#include <QDir>

// 前向声明DisconnectLogger
class DisconnectLogger;

class RobotManager;

class RobotClient : public QObject
{
    Q_OBJECT

public:
    explicit RobotClient(QTcpSocket *socket, QObject *parent = nullptr);
    ~RobotClient();

    // 客户端信息
    QString getClientAddress() const;
    int getClientPort() const;
    QString getRobotSN() const;
    bool isRegistered() const;
    bool isConnected() const;
    
    // 控制方法
    void disconnectFromHost();
    void sendMessage(const QJsonObject &message);

signals:
    void registered(const QString &sn);
    void disconnected();
    void dataReceived(const QString &sn, const QJsonObject &data);
    void heartbeatReceived(const QString &sn, const QJsonObject &data);  // 【关键优化】心跳隔离专用信号
    void errorOccurred(const QString &error);
    void jsonParseError(const QString &clientIp, const QString &rawData, const QString &errorMsg);

private slots:
    void onReadyRead();
    void onDisconnected();
    void onErrorOccurred(QAbstractSocket::SocketError error);
    void onHeartbeatTimeout();

private:
    // 添加心跳状态结构
    struct HeartbeatState {
        qint64 lastReceivedTime = 0;
        qint64 lastTimeoutTime = 0;
        int consecutiveTimeouts = 0;
        int missedHeartbeats = 0;
    };
    
    QTcpSocket *m_socket;
    QTimer *m_heartbeatTimer;
    QTimer *m_networkCheckTimer;
    QTimer *m_registerTimeoutTimer;  // 添加注册超时定时器
    QString m_robotSN;
    bool m_isRegistered;
    QByteArray m_buffer;
    int m_networkErrorCount;
    QString m_serverAddress;
    int m_serverPort;
    
    // 添加心跳状态成员
    HeartbeatState m_heartbeatState;
    
    // 添加缓存的客户端地址，用于解决IP获取失败问题
    QString m_cachedClientAddress;
    
    // 添加用于数据包日志记录的成员变量
    QFile *m_packetLog;
    QString m_currentLogFileName;
    
    // 添加异步日志队列和相关成员
    QQueue<QByteArray> m_logQueue;
    QTimer *m_logFlushTimer;
    QMutex m_logMutex;
    
    // 添加连接开始时间，用于计算连接持续时间
    qint64 m_connectionStartTime;
    
    static const int HEARTBEAT_TIMEOUT = 90000; // 90秒心跳超时（增加容错时间）
    static const int REGISTER_TIMEOUT = 60000; // 60秒注册超时
    static const int MAX_NETWORK_ERRORS = 3; // 最大网络错误次数
    
    void processMessage(const QJsonObject &message);
    void handleRegistration(const QJsonObject &message);
    void handleDataUpdate(const QJsonObject &message);
    void handleHeartbeat(const QJsonObject &message);
    void handleRTSPUrls(const QJsonObject &message);
    void handleRequestRTSPUrls(const QJsonObject &message);
    void handleTimeSync(const QJsonObject &message);
    void handleTimeSyncAck(const QJsonObject &message);
    void startHeartbeatTimer();
    void stopHeartbeatTimer();
    void startNetworkCheckTimer();
    void stopNetworkCheckTimer();
    void startRegisterTimeoutTimer();  // 添加注册超时定时器启动函数
    void stopRegisterTimeoutTimer();   // 添加注册超时定时器停止函数
    void checkNetworkStatus();
    void onRegisterTimeout();          // 添加注册超时处理函数
    QJsonObject parseJsonFromBuffer();
    
    // 添加数据包日志记录相关的方法
    void initializePacketLog();
    void logPacket(const QByteArray &data);
    void flushLogQueue();  // 添加异步日志刷新函数
    QString getCurrentLogFileName();
    QString socketStateToString(QAbstractSocket::SocketState state) const;  // 添加这个声明
};

#endif // ROBOTCLIENT_H